package handler

import (
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"

	"Data-API-MCP/backend/internal/application/dto"
	"Data-API-MCP/backend/internal/application/usecase"
)

// UserHandler 用户处理器
type UserHandler struct {
	userUseCase *usecase.UserUseCase
}

// NewUserHandler 创建用户处理器
func NewUserHandler(userUseCase *usecase.UserUseCase) *UserHandler {
	return &UserHandler{
		userUseCase: userUseCase,
	}
}

// Register 用户注册
// @Summary 用户注册
// @Description 注册新用户
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param user body dto.UserRegisterRequest true "用户注册请求"
// @Success 200 {object} dto.User "用户信息"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/users/register [post]
func (h *UserHandler) Register(c *gin.Context) {
	var req dto.UserRegisterRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	user, err := h.userUseCase.Register(c.Request.Context(), &req)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, user)
}

// Login 用户登录
// @Summary 用户登录
// @Description 登录已注册用户
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param user body dto.UserLoginRequest true "用户登录请求"
// @Success 200 {object} dto.UserLoginResponse "登录成功"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/users/login [post]
func (h *UserHandler) Login(c *gin.Context) {
	var req dto.UserLoginRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	resp, err := h.userUseCase.Login(c.Request.Context(), &req)
	if err != nil {
		c.JSON(http.StatusUnauthorized, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, resp)
}

// GetUserInfo 获取用户信息
// @Summary 获取用户信息
// @Description 获取指定ID的用户信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path string true "用户ID"
// @Success 200 {object} dto.User "用户信息"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/users/{id} [get]
func (h *UserHandler) GetUserInfo(c *gin.Context) {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	user, err := h.userUseCase.GetUserInfo(c.Request.Context(), uint(id))
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, user)
}

// UpdateUserInfo 更新用户信息
// @Summary 更新用户信息
// @Description 更新指定ID的用户信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path string true "用户ID"
// @Param user body dto.UserUpdateRequest true "用户更新请求"
// @Success 200 {object} object "成功"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/users/{id} [put]
func (h *UserHandler) UpdateUserInfo(c *gin.Context) {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	var req dto.UserUpdateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	if err := h.userUseCase.UpdateUserInfo(c.Request.Context(), uint(id), &req); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"message": "更新成功"})
}

// ChangePassword 修改密码
// @Summary 修改密码
// @Description 修改指定ID用户的密码
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path string true "用户ID"
// @Param password body dto.UserChangePasswordRequest true "密码修改请求"
// @Success 200 {object} object "成功"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/users/{id}/password [put]
func (h *UserHandler) ChangePassword(c *gin.Context) {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	var req dto.UserChangePasswordRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	if err := h.userUseCase.ChangePassword(c.Request.Context(), uint(id), &req); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"message": "密码修改成功"})
}

// ListUsers 获取用户列表
// @Summary 获取用户列表
// @Description 获取所有用户列表
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param offset query int false "偏移量"
// @Param limit query int false "限制数量"
// @Success 200 {array} dto.User "用户列表"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/users [get]
func (h *UserHandler) ListUsers(c *gin.Context) {
	offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
	limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))

	users, err := h.userUseCase.ListUsers(c.Request.Context(), offset, limit)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, users)
}

// DeleteUser 删除用户
// @Summary 删除用户
// @Description 删除指定ID的用户
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path string true "用户ID"
// @Success 200 {object} object "成功"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/users/{id} [delete]
func (h *UserHandler) DeleteUser(c *gin.Context) {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	if err := h.userUseCase.DeleteUser(c.Request.Context(), uint(id)); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"message": "删除成功"})
}
